package com.demo.java.OD551_600.OD580;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【服务失效判断(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146567127
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取依赖关系列表，存储为列表
        String[] dependencyInput = scanner.nextLine().split(",");
        List<String[]> dependencies = new ArrayList<>();
        for (String dep : dependencyInput) {
            dependencies.add(dep.split("-"));
        }

        // 读取故障服务列表
        List<String> failedServices = Arrays.asList(scanner.nextLine().split(","));

        // 存储服务依赖关系的映射（被依赖的服务 -> 依赖它的服务）
        Map<String, Set<String>> dependencyMap = new HashMap<>();

        // 记录服务首次出现的顺序，确保最终输出按输入顺序排序
        Map<String, Integer> serviceOrder = new HashMap<>();
        int order = 0;

        // 构建服务依赖映射
        for (String[] dependency : dependencies) {
            String dependent = dependency[0], prerequisite = dependency[1];

            // 初始化依赖关系映射
            dependencyMap.putIfAbsent(dependent, new HashSet<>());
            dependencyMap.putIfAbsent(prerequisite, new HashSet<>());
            dependencyMap.get(prerequisite).add(dependent);

            // 记录服务首次出现顺序
            serviceOrder.putIfAbsent(dependent, order++);
            serviceOrder.putIfAbsent(prerequisite, order++);
        }

        // 递归删除所有受影响的服务
        for (String failedService : failedServices) {
            removeAffectedServices(dependencyMap, failedService);
        }

        // 获取所有仍然正常运行的服务
        List<String> activeServices = new ArrayList<>(dependencyMap.keySet());

        // 如果所有服务都故障，输出一个逗号，否则按顺序输出正常服务
        if (activeServices.isEmpty()) {
            System.out.println(",");
        } else {
            activeServices.sort(Comparator.comparingInt(serviceOrder::get));
            System.out.println(String.join(",", activeServices));
        }

        scanner.close();
    }

    /**
     * 递归删除受影响的服务
     *
     * @param dependencyMap 存储服务依赖关系的映射
     * @param failedService 当前故障的服务
     */
    private static void removeAffectedServices(Map<String, Set<String>> dependencyMap, String failedService) {
        if (dependencyMap.containsKey(failedService)) {
            Set<String> affected = dependencyMap.get(failedService);
            dependencyMap.remove(failedService);
            // 继续递归删除受影响的服务
            for (String service : affected) {
                removeAffectedServices(dependencyMap, service);
            }
        }
    }
}